home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mission 3
/
Mission 3.zip
/
Mission 3.iso
/
zugabe
/
va45
/
visual45
/
library
/
extend
/
file.s
< prev
next >
Wrap
Text File
|
1998-05-23
|
6KB
|
244 lines
ifd LIB_FIND_TEXT_IN_FILE
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_FILE_RETURN_TEXT_IN_FILE
; Description : Recherche d'une chaine de caractère dans un ficher et recopie
; Description : de la ligne dans un buffer
;
; Rq : Les lignes du fichier doivent impérativement se terminer par #rc
;
; in : a0.l = pointeur sur la chaine du nom de fichier
; in : a1.l = chaine de caractère à rechercher
; in : a2.l = pointeur sur un buffer où stocker résultat + calcul intermédiaire
; in : d0.l = taille du buffer pointer par a2
; out : d7.w = GWVA_NO_ERROR_GENERIC si pas d'erreur, GWVA_ERROR_GENERIC sinon
; out : (a2) = copie de la chaine de caractères cherchée jusqu'au #rc, remplacé
; par un 0.b
;
; 16/05/98 : Création
;------------------------------------------------------------------------------
GWVA_FILE_RETURN_TEXT_IN_FILE:
move.l d0,d5 ; d5 = taille buffer tout du long
save.l d0/d5/a1/a2
FILE_OPEN read,(a0),d7
load.l d0/d5/a1/a2
tst d7
bmi .error
clr.l d1 ; buff temp
clr.l d2 ; string to comp
move.l d0,d3
; a1 = ptr sur début string à comparer tout du long
; a2 = ptr sur début buffer tout du long
.load_some_more:
save.l d1-d3/d5/a1-a2
move.l a2,a0
add.l d1,a0
FREAD a0,d3,d7
load.l d1-d3/d5/a1-a2
tst.l d0
beq .error2
add.l d1,d0
add.l d1,d3
.compare_more:
move.b (a2,d1.l),d6 ; dans buffer
cmp.b (a1,d2.l),d6 : == string ??
bne.s .badcomp
addq.l #1,d2 ; bonne comparaison
tst.b (a1,d2.l)
bne.s .for_both ; pas rendu à la fin de la comparaison
move.l a1,a3 ; on recopie le tout en tête de buffer
move.l a2,a4
move.l d2,d4 ; d2=long chaine de comparaison à recopier donc
subq #1,d4
.cp: move.b (a3)+,(a4)+
dbf d4,.cp
.copy_ok: addq.l #1,d1 ; recopie ce qui suivait la string dans buffer
cmp.l d1,d0
beq.s .reload_encore
move.b (a2,d1.l),d4
cmp.b #rc,d4
beq.s .finito
move.b d4,(a4)+
bra.s .copy_ok
.reload_encore:
move.l a2,d0
add.l d5,d0
sub.l a4,d0
save.l a4
FREAD a4,d0,d7 ; on sauve rien de plus : c'est fini
load.l a4
.sear: cmp.b #rc,(a4)+ ; chaque ligne doit se terminer par rc
bne.s .sear
lea -1(a4),a4
.finito: clr.b (a4)+
bra.s .fin_ok
.badcomp: clr.l d2
* bra.s .compare_more ; bug algorithmique : si recherche ABC
; et on a : ABABC : trouve pas ...
; ici ca va car on a toujours le champs d'avant qui est spécial
.for_both: addq.l #1,d1
cmp.l d1,d0
bne.s .compare_more
tst.l d2
beq.s .pas_coupe
move.l a1,a3 ; coupé
move.l a2,a4
move.l d2,d4
subq #1,d4
.cp2: move.b (a3)+,(a4)+
dbf d4,.cp2
move.l d2,d1 ; buff temp
move.l d5,d3
sub.l d1,d3 ; how many to load
bra .load_some_more
.pas_coupe: cmp.l d3,d0
bne.s .error2
clr.l d1 ; buff temp
*clr.l d2 ; string to comp
move.l d5,d3
bra .load_some_more
.fin_ok: FCLOSE d7
move.w #GWVA_NO_ERROR_GENERIC,d7
rts
.error2: FCLOSE d7
.error: move.w #GWVA_ERROR_GENERIC,d7
rts
endc ; ifd LIB_FIND_TEXT_IN_FILE
ifd LIB_GET_FLENGTH
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_FILE_RETURN_LENGTH
; Description : Renvoie la taille d'un fichier
;
; in : a0.l = pointeur sur la chaine du nom de fichier
; out : d0.l = longueur du fichier ou <=0 si erreur
;
; 15/03/98 : Création
;------------------------------------------------------------------------------
GWVA_FILE_RETURN_LENGTH:
save.l a0
FGETDTA
save.l d0 ; d0.l = adresse ancien DTA
FSETDTA GWVA_ROOT_DTA
load.l d0
load.l a0 ; a0.l = ptr sur le nom du fichier
save.l d0
FSFIRST #FA_ARCHIVE|FA_HIDDEN|FA_READONLY,(a0)
load.l a0 ; a0.l = adresse ancien DTA
save.w d0 ; d0.w code d'erreur de FSFIRST
FSETDTA (a0)
load.w d0
ext.l d0
bmi.s .erreur
move.l GWVA_ROOT_DTA+d_lenght,d0
.erreur: rts
endc ; ifd LIB_GET_FLENGTH
ifd LIB_LOAD_FILE_IN_MEM
ifnd LIB_GET_FLENGTH
fail ; LIB_LOAD_FILE_IN_MEM a besoin de la librairie LIB_GET_FLENGTH
end
endc
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_FILE_LOAD_IN_MEM
; Description : Charge un fichier en allouant la mémoire par MXALLOC
;
; Rq : Nécessite la librairie LIB_GET_FLENGTH
;
; in : a0.l = pointeur sur la chaine du nom de fichier
; in : d0.w = mode d'allocation de la mémoire (voir mxalloc) - constantes définies
; out : a0.l = pointeur sur le fichier chargé
; out : d0.l = longueur du fichier ou <=0 si erreur
;
; 15/03/98 : Création
;------------------------------------------------------------------------------
GWVA_FILE_LOAD_IN_MEM:
save.l d0/a0
bsr GWVA_FILE_RETURN_LENGTH
load.l d1/a0 ; d1.w = mode allocation MXALLOC
tst.l d0
ble.s .error_name_file
save.l d0/a0 ; d0.l = longueur du fichier
MXALLOC d1,d0
load.l d1/a0 ; d1.l = longeur, a0.l = ptr nom
tst.l d0 ; d0.l = pointeur la zone malloc
beq.s .error_allocation_mem
save.l d0/d1 ; d0.l = ptr buffer, d1.l = longeur
FILE_OPEN read,(a0),d7
load.l d0/d1
tst d7
bmi.s .error_open_file
save.l d0/d1
FREAD d0,d1,d7
save.l d0
FCLOSE d7
load.l d2 ; d2.l = longueur du fichier chargé
load.l d0/d1
cmp.l d2,d1
bne.s .error_read_file
move.l d0,a0 ; a0.l = ptr buffer
move.l d1,d0 ; longueur
.error_name_file:
rts
.error_allocation_mem:
move.l #GWVA_ERROR_MALLOC,d0
rts
.error_open_file:
save.w d7
MFREE d0
load.w d7
move.w d7,d0
ext.l d0
rts
.error_read_file:
MFREE d0
move.l #GWVA_ERROR_READ,d0
rts
endc ; ifd LIB_LOAD_FILE_IN_MEM